/**
设计一个简化版的推特(Twitter)，可以让用户实现发送推文，关注/取消关注其他用户，能够看见关注人（包括自己）的最近十条推文。你的设计需要支持以下的几个功能：

postTweet(userId, tweetId): 创建一条新的推文
getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近的开始排序。
follow(followerId, followeeId): 关注一个用户
unfollow(followerId, followeeId): 取消关注一个用户
示例:

Twitter twitter = new Twitter();

// 用户1发送了一条新推文 (用户id = 1, 推文id = 5).
twitter.postTweet(1, 5);

// 用户1的获取推文应当返回一个列表，其中包含一个id为5的推文.
twitter.getNewsFeed(1);

// 用户1关注了用户2.
twitter.follow(1, 2);

// 用户2发送了一个新推文 (推文id = 6).
twitter.postTweet(2, 6);

// 用户1的获取推文应当返回一个列表，其中包含两个推文，id分别为 -> [6, 5].
// 推文id6应当在推文id5之前，因为它是在5之后发送的.
twitter.getNewsFeed(1);

// 用户1取消关注了用户2.
twitter.unfollow(1, 2);

// 用户1的获取推文应当返回一个列表，其中包含一个id为5的推文.
// 因为用户1已经不再关注用户2.
twitter.getNewsFeed(1);


来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/design-twitter
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
class Twitter {
private:
    map<int, set<int>> user_follow;
    vector<int> messages;
    vector<int> messages_poster;

public:
    Twitter() {
    }

    void postTweet(int userId, int tweetId) {
        messages.push_back(tweetId);
        messages_poster.push_back(userId);
    }
    
    vector<int> getNewsFeed(int userId) {
        int count = 10;
        int index = messages.size() - 1;
        vector<int> res;

        while (count && index >= 0) {
            if (messages_poster[index] == userId)
                res.push_back(messages[index]);
            else if (user_follow[userId].count(messages_poster[index]))
                res.push_back(messages[index]);
            else
                ++count;
            --count;
            --index;
        }

        return res;
    }

    void follow(int followerId, int followeeId) {
        user_follow[followerId].insert(followeeId);
    }

    void unfollow(int followerId, int followeeId) {
        user_follow[followerId].erase(followeeId);
    }
};